home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / perl / 5.10.0 / CORE / gv.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-06-26  |  7.8 KB  |  228 lines

  1. /*    gv.h
  2.  *
  3.  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
  4.  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
  5.  *
  6.  *    You may distribute under the terms of either the GNU General Public
  7.  *    License or the Artistic License, as specified in the README file.
  8.  *
  9.  */
  10.  
  11. struct gp {
  12.     SV *    gp_sv;        /* scalar value */
  13.     struct io *    gp_io;        /* filehandle value */
  14.     CV *    gp_cv;        /* subroutine value */
  15.     U32        gp_cvgen;    /* generational validity of cached gv_cv */
  16.     U32        gp_refcnt;    /* how many globs point to this? */
  17.     HV *    gp_hv;        /* hash value */
  18.     AV *    gp_av;        /* array value */
  19.     CV *    gp_form;    /* format value */
  20.     GV *    gp_egv;        /* effective gv, if *glob */
  21.     line_t    gp_line;    /* line first declared at (for -w) */
  22.     HEK *    gp_file_hek;    /* file first declared in (for -w) */
  23. };
  24.  
  25. #define GvXPVGV(gv)    ((XPVGV*)SvANY(gv))
  26.  
  27.  
  28. #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
  29. #  define GvGP(gv)                            \
  30.     (*({GV *const shplep = (GV *) (gv);                \
  31.         assert(SvTYPE(shplep) == SVt_PVGV || SvTYPE(shplep) == SVt_PVLV); \
  32.         assert(isGV_with_GP(shplep));                \
  33.         &((shplep)->sv_u.svu_gp);}))
  34. #  define GvFLAGS(gv)                            \
  35.     (*({GV *const yaah  = (GV *) (gv);                \
  36.         assert(SvTYPE(yaah) == SVt_PVGV || SvTYPE(yaah) == SVt_PVLV); \
  37.         assert(isGV_with_GP(yaah));                    \
  38.         &(GvXPVGV(yaah)->xpv_cur);}))
  39. #  define GvSTASH(gv)                            \
  40.     (*({ GV * const _gv = (GV *) (gv);                \
  41.         assert(isGV_with_GP(_gv));                    \
  42.         assert(SvTYPE(_gv) == SVt_PVGV || SvTYPE(_gv) >= SVt_PVLV);    \
  43.         &(GvXPVGV(_gv)->xnv_u.xgv_stash);                \
  44.      }))
  45. #  define GvNAME_HEK(gv)                        \
  46.     (*({ GV * const zzzz = (GV *) (gv);                \
  47.        assert(isGV_with_GP(zzzz));                    \
  48.        assert(SvTYPE(zzzz) == SVt_PVGV || SvTYPE(zzzz) >= SVt_PVLV); \
  49.        assert(!SvVALID(zzzz));                    \
  50.        &(GvXPVGV(zzzz)->xiv_u.xivu_namehek);            \
  51.      }))
  52. #  define GvNAME_get(gv)    ({ assert(GvNAME_HEK(gv)); HEK_KEY(GvNAME_HEK(gv)); })
  53. #  define GvNAMELEN_get(gv)    ({ assert(GvNAME_HEK(gv)); HEK_LEN(GvNAME_HEK(gv)); })
  54. #else
  55. #  define GvGP(gv)    ((gv)->sv_u.svu_gp)
  56. #  define GvFLAGS(gv)    (GvXPVGV(gv)->xpv_cur)
  57. #  define GvSTASH(gv)    (GvXPVGV(gv)->xnv_u.xgv_stash)
  58. #  define GvNAME_HEK(gv)    (GvXPVGV(gv)->xiv_u.xivu_namehek)
  59. #  define GvNAME_get(gv)    HEK_KEY(GvNAME_HEK(gv))
  60. #  define GvNAMELEN_get(gv)    HEK_LEN(GvNAME_HEK(gv))
  61. #endif
  62.  
  63. #define GvNAME(gv)    GvNAME_get(gv)
  64. #define GvNAMELEN(gv)    GvNAMELEN_get(gv)
  65.  
  66. #define    GvASSIGN_GENERATION(gv)        (0 + ((XPV*) SvANY(gv))->xpv_len)
  67. #define    GvASSIGN_GENERATION_set(gv,val)            \
  68.     STMT_START { assert(SvTYPE(gv) == SVt_PVGV);    \
  69.         (((XPV*) SvANY(gv))->xpv_len = (val)); } STMT_END
  70.  
  71. /*
  72. =head1 GV Functions
  73.  
  74. =for apidoc Am|SV*|GvSV|GV* gv
  75.  
  76. Return the SV from the GV.
  77.  
  78. =cut
  79. */
  80.  
  81. #define GvSV(gv)    (GvGP(gv)->gp_sv)
  82. #ifdef PERL_DONT_CREATE_GVSV
  83. #define GvSVn(gv)    (*(GvGP(gv)->gp_sv ? \
  84.              &(GvGP(gv)->gp_sv) : \
  85.              &(GvGP(gv_SVadd(gv))->gp_sv)))
  86. #else
  87. #define GvSVn(gv)    GvSV(gv)
  88. #endif
  89.  
  90. #define GvREFCNT(gv)    (GvGP(gv)->gp_refcnt)
  91. #define GvIO(gv)    ((gv) && SvTYPE((SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : NULL)
  92. #define GvIOp(gv)    (GvGP(gv)->gp_io)
  93. #define GvIOn(gv)    (GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv)))
  94.  
  95. #define GvFORM(gv)    (GvGP(gv)->gp_form)
  96. #define GvAV(gv)    (GvGP(gv)->gp_av)
  97.  
  98. /* This macro is deprecated.  Do not use! */
  99. #define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv))    /* DO NOT USE */
  100.  
  101. #define GvAVn(gv)    (GvGP(gv)->gp_av ? \
  102.              GvGP(gv)->gp_av : \
  103.              GvGP(gv_AVadd(gv))->gp_av)
  104. #define GvHV(gv)    ((GvGP(gv))->gp_hv)
  105.  
  106. #define GvHVn(gv)    (GvGP(gv)->gp_hv ? \
  107.              GvGP(gv)->gp_hv : \
  108.              GvGP(gv_HVadd(gv))->gp_hv)
  109.  
  110. #define GvCV(gv)    (GvGP(gv)->gp_cv)
  111. #define GvCVGEN(gv)    (GvGP(gv)->gp_cvgen)
  112. #define GvCVu(gv)    (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv)
  113.  
  114. #define GvLINE(gv)    (GvGP(gv)->gp_line)
  115. #define GvFILE_HEK(gv)    (GvGP(gv)->gp_file_hek)
  116. #define GvFILE(gv)    (GvFILE_HEK(gv) ? HEK_KEY(GvFILE_HEK(gv)) : NULL)
  117. #define GvFILEGV(gv)    (gv_fetchfile(GvFILE(gv)))
  118.  
  119. #define GvEGV(gv)    (GvGP(gv)->gp_egv)
  120. #define GvENAME(gv)    GvNAME(GvEGV(gv) ? GvEGV(gv) : gv)
  121. #define GvESTASH(gv)    GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv)
  122.  
  123. #define GVf_INTRO    0x01
  124. #define GVf_MULTI    0x02
  125. #define GVf_ASSUMECV    0x04
  126. #define GVf_IN_PAD    0x08
  127. #define GVf_IMPORTED    0xF0
  128. #define GVf_IMPORTED_SV      0x10
  129. #define GVf_IMPORTED_AV      0x20
  130. #define GVf_IMPORTED_HV      0x40
  131. #define GVf_IMPORTED_CV      0x80
  132.  
  133. #define GvINTRO(gv)        (GvFLAGS(gv) & GVf_INTRO)
  134. #define GvINTRO_on(gv)        (GvFLAGS(gv) |= GVf_INTRO)
  135. #define GvINTRO_off(gv)        (GvFLAGS(gv) &= ~GVf_INTRO)
  136.  
  137. #define GvMULTI(gv)        (GvFLAGS(gv) & GVf_MULTI)
  138. #define GvMULTI_on(gv)        (GvFLAGS(gv) |= GVf_MULTI)
  139. #define GvMULTI_off(gv)        (GvFLAGS(gv) &= ~GVf_MULTI)
  140.  
  141. #define GvASSUMECV(gv)        (GvFLAGS(gv) & GVf_ASSUMECV)
  142. #define GvASSUMECV_on(gv)    (GvFLAGS(gv) |= GVf_ASSUMECV)
  143. #define GvASSUMECV_off(gv)    (GvFLAGS(gv) &= ~GVf_ASSUMECV)
  144.  
  145. #define GvIMPORTED(gv)        (GvFLAGS(gv) & GVf_IMPORTED)
  146. #define GvIMPORTED_on(gv)    (GvFLAGS(gv) |= GVf_IMPORTED)
  147. #define GvIMPORTED_off(gv)    (GvFLAGS(gv) &= ~GVf_IMPORTED)
  148.  
  149. #define GvIMPORTED_SV(gv)    (GvFLAGS(gv) & GVf_IMPORTED_SV)
  150. #define GvIMPORTED_SV_on(gv)    (GvFLAGS(gv) |= GVf_IMPORTED_SV)
  151. #define GvIMPORTED_SV_off(gv)    (GvFLAGS(gv) &= ~GVf_IMPORTED_SV)
  152.  
  153. #define GvIMPORTED_AV(gv)    (GvFLAGS(gv) & GVf_IMPORTED_AV)
  154. #define GvIMPORTED_AV_on(gv)    (GvFLAGS(gv) |= GVf_IMPORTED_AV)
  155. #define GvIMPORTED_AV_off(gv)    (GvFLAGS(gv) &= ~GVf_IMPORTED_AV)
  156.  
  157. #define GvIMPORTED_HV(gv)    (GvFLAGS(gv) & GVf_IMPORTED_HV)
  158. #define GvIMPORTED_HV_on(gv)    (GvFLAGS(gv) |= GVf_IMPORTED_HV)
  159. #define GvIMPORTED_HV_off(gv)    (GvFLAGS(gv) &= ~GVf_IMPORTED_HV)
  160.  
  161. #define GvIMPORTED_CV(gv)    (GvFLAGS(gv) & GVf_IMPORTED_CV)
  162. #define GvIMPORTED_CV_on(gv)    (GvFLAGS(gv) |= GVf_IMPORTED_CV)
  163. #define GvIMPORTED_CV_off(gv)    (GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
  164.  
  165. #define GvIN_PAD(gv)        (GvFLAGS(gv) & GVf_IN_PAD)
  166. #define GvIN_PAD_on(gv)        (GvFLAGS(gv) |= GVf_IN_PAD)
  167. #define GvIN_PAD_off(gv)    (GvFLAGS(gv) &= ~GVf_IN_PAD)
  168.  
  169. #define GvUNIQUE(gv)            0
  170. #define GvUNIQUE_on(gv)         NOOP
  171. #define GvUNIQUE_off(gv)        NOOP
  172.  
  173. #ifdef USE_ITHREADS
  174. #define GV_UNIQUE_CHECK
  175. #else
  176. #undef  GV_UNIQUE_CHECK
  177. #endif
  178.  
  179. #define Nullgv Null(GV*)
  180.  
  181. #define DM_UID   0x003
  182. #define DM_RUID   0x001
  183. #define DM_EUID   0x002
  184. #define DM_ARRAY 0x004
  185. #define DM_GID   0x030
  186. #define DM_RGID   0x010
  187. #define DM_EGID   0x020
  188. #define DM_DELAY 0x100
  189.  
  190. /*
  191.  * symbol creation flags, for use in gv_fetchpv() and get_*v()
  192.  */
  193. #define GV_ADD        0x01    /* add, if symbol not already there
  194.                    For gv_name_set, adding a HEK for the first
  195.                    time, so don't try to free what's there.  */
  196. #define GV_ADDMULTI    0x02    /* add, pretending it has been added already */
  197. #define GV_ADDWARN    0x04    /* add, but warn if symbol wasn't already there */
  198. #define GV_ADDINEVAL    0x08    /* add, as though we're doing so within an eval */
  199. #define GV_NOINIT    0x10    /* add, but don't init symbol, if type != PVGV */
  200. /* This is used by toke.c to avoid turing placeholder constants in the symbol
  201.    table into full PVGVs with attached constant subroutines.  */
  202. #define GV_NOADD_NOINIT    0x20    /* Don't add the symbol if it's not there.
  203.                    Don't init it if it is there but ! PVGV */
  204. #define GV_NOEXPAND    0x40    /* Don't expand SvOK() entries to PVGV */
  205. #define GV_NOTQUAL    0x80    /* A plain symbol name, not qualified with a
  206.                    package (so skip checks for :: and ')  */
  207.  
  208. /*      SVf_UTF8 (more accurately the return value from SvUTF8) is also valid
  209.     as a flag to gv_fetch_pvn_flags, so ensure it lies outside this range.
  210. */
  211.  
  212. #define GV_NOADD_MASK    (SVf_UTF8|GV_NOADD_NOINIT|GV_NOEXPAND|GV_NOTQUAL)
  213. /* The bit flags that don't cause gv_fetchpv() to add a symbol if not found */
  214.  
  215. #define gv_fullname3(sv,gv,prefix) gv_fullname4(sv,gv,prefix,TRUE)
  216. #define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE)
  217. #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE)
  218.  
  219. /*
  220.  * Local variables:
  221.  * c-indentation-style: bsd
  222.  * c-basic-offset: 4
  223.  * indent-tabs-mode: t
  224.  * End:
  225.  *
  226.  * ex: set ts=8 sts=4 sw=4 noet:
  227.  */
  228.